// * 1. 箭头函数没有 this，如果在箭头函数内部访问 this，则会从外部获取。

// 例子：
let group = {
	title: 'Our Group',
	students: ['John', 'Bill', 'Jane'],

	showList() {
		// this => group
		this.students.forEach((s) => console.log(this.title + ':' + s))
	},
}

group.showList()

// * 2. 不能对箭头函数进行 new 操作。没有 this 自然也就不能用作构造器，被 new 调用了。

// * 3. 箭头函数 VS bind

let user = {
	name: 'User',
}

let obj = {
	name: 'Obj',
	fn() {
		let arrowFn = () => {
			console.log(this.name)
		}

		arrowFn.bind(user)() // 箭头函数没有 this，所以 bind 后也还是在函数运行时向外部查找。
	},
}

obj.fn() // Obj

// * 4. 箭头函数没有 arguments，会向外找，用包裹它函数的 arguments 变量。

// 例子：
function defer(f, ms) {
	return function () {
		setTimeout(() => f.apply(this, arguments), ms)
	}
}

function sayHi(who) {
	console.log('Hello, ' + who)
}

let sayHiDeferred = defer(sayHi, 1000)

sayHiDeferred('John') // Hello, John

// * 总结：
// 箭头函数：1.没有this（向外层函数查找） 2.没有arguments（向外层函数查找） 3.不能使用 new 进行调用 4. 它们也没有 super。
// 被 bind 绑定后，this 还是向外层查找。
